﻿#include <iostream>
#include <opencv2/opencv.hpp>

// 判断颜色是否为红色
bool isRedColor(const cv::Mat& hsvFrame, int x, int y) {
    cv::Vec3b color = hsvFrame.at<cv::Vec3b>(y, x);
    int h = color[0];
    int s = color[1];
    int v = color[2];
    return h > 0 && h < 10 && s > 127 && v > 127; // 调整HSV阈值以识别红色
}

// 判断颜色是否为蓝色
bool isBlueColor(const cv::Mat& hsvFrame, int x, int y) {
    cv::Vec3b color = hsvFrame.at<cv::Vec3b>(y, x);
    int h = color[0];
    int s = color[1];
    int v = color[2];
    return h > 80 && h < 110 && s > 127 && v > 127; // 调整HSV阈值以识别蓝色
}

// 灯条识别函数
void detectLightBars(cv::Mat frame, const std::string& color1) {
    cv::Mat hsvFrame;
    cv::cvtColor(frame, hsvFrame, cv::COLOR_BGR2HSV);

    // 二值化处理
    cv::Mat binaryFrame;
    if (color1 == "red") {
        cv::inRange(hsvFrame, cv::Scalar(0, 127, 127), cv::Scalar(10, 255, 255), binaryFrame);
    }
    else if (color1 == "blue") {
        cv::inRange(hsvFrame, cv::Scalar(80, 127, 127), cv::Scalar(110, 255, 255), binaryFrame);
    }

    // 创建结构元素用于膨胀
    cv::Mat structuringElement = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));

    // 进行膨胀操作
    cv::dilate(binaryFrame, binaryFrame, structuringElement);

    // 找到边缘连接轮廓
    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(binaryFrame, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    for (const auto& contour : contours) {
        cv::Rect boundingRect = cv::boundingRect(contour);
        float aspectRatio = (float)boundingRect.width / boundingRect.height;
        if (aspectRatio < 0.5) {
            cv::rectangle(frame, boundingRect, cv::Scalar(0, 255, 0), 2);
        }
    }

    cv::imshow("Light Bars", frame);
}

int main() {
    //std::string videoPath = "C:\\Users\\aaa\\Pictures\\Screenshots\\步兵素材蓝车旋转-ev-+3.MOV";
    std::string videoPath = "C:\\Users\\aaa\\Pictures\\Screenshots\\步兵素材红车旋转-ev--3.MOV";
    cv::VideoCapture video(videoPath);

    if (!video.isOpened()) {
        std::cout << "Could not open the video." << std::endl;
        return -1;
    }

    cv::Mat frame;
    std::string enermycolor = "red";
    while (true) {
        video >> frame;
        if (frame.empty())
            break;

        detectLightBars(frame, enermycolor);

        if (cv::waitKey(30) >= 0)
            break;
    }

    video.release();
    cv::destroyAllWindows();

    return 0;
}